package com.zhiche.lisa.lspm.service.carrier;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.zhiche.lisa.core.supports.BaseException;
import com.zhiche.lisa.lspm.dao.model.carrier.CarrierInfo;
import com.zhiche.lisa.lspm.dao.model.carrier.bo.*;
import com.zhiche.lisa.lspm.dao.model.trailer.bo.TrailerCarrierBO;
import com.zhiche.lisa.lspm.vo.driver.AttachVO;
import com.zhiche.lisa.lspm.vo.vehicle.*;

import java.util.List;

/**
 * 牵引车 service
 *
 * @author lbl
 * @since 2018-05-23
 */
public interface ICarrierInfoService extends IService<CarrierInfo> {

    /**
     * 牵引车基础信息列表
     *
     * @param page
     * @return
     */
    Page<CarrierInfoLineVO> carrierInfoLine(Page<CarrierInfoLineBO> page, String authorization);

    /**
     * 认证牵引车基础信息列表
     *
     * @param page
     * @return
     */
    Page<CarrierInfoLineVO> authedCarrierInfoLine(Page<CarrierInfoLineBO> page);

    /**
     * 添加牵引车基础信息
     *
     * @param modifyCarrierInfoBO
     */
    void addCarrierInfo(ModifyCarrierInfoBO modifyCarrierInfoBO) throws BaseException;

    void updateLicense(ModifyCarrierInfoBO modifyCarrierInfoBO);

    void deleteLicense(ModifyCarrierLicenseBO modifyCarrierLicenseBO);

    /**
     * 根据 id 查找编辑信息
     *
     * @param id
     * @return
     */
    ModifyCarrierInfoBO findModifyInfo(Long id);

    /**
     * 编辑牵引车基础信息
     *
     * @param modifyCarrierInfoBO
     */
    void modifyCarrierInfo(ModifyCarrierInfoBO modifyCarrierInfoBO);

    /**
     * 校验添加/编辑的数据
     *
     * @param modifyCarrierInfoBO
     * @param operate
     */
    void checkModifyData(ModifyCarrierInfoBO modifyCarrierInfoBO, String operate);

    /**
     * 获取所有牵引车
     *
     * @param page
     * @return
     */
    Page<CarrierDetailVO> getCarrierByLsp(Page<CarrierDetailVO> page, String authorization);


    /**
     * 停用牵引车
     *
     * @param carrierIds
     */
    List<String> discontinuatCarrier(Long[] carrierIds) throws BaseException;

    /**
     * 启用牵引车
     *
     * @param carrierIds
     */
    List<String> enableCarrier(Long[] carrierIds) throws BaseException;

    /**
     * 根据承运商 id 批量更新状态
     *
     * @param status
     * @param lspIdList
     */
    void batchUpdateStatusByLspId(Integer authStatus, Integer status, List<Long> lspIdList);

    /**
     * 根据承运商ID的得到牵引车
     *
     * @param lspId
     * @return
     */
    List<CarrierInfo> getListsByLspId(Long lspId);

    void carrierToERP(String authorization, Long carrierId);

    /**
     * 牵引车多条认证
     *
     * @param carrierIds
     */
    List<String> batchUpdateAuthStatusByIds(Long[] carrierIds, String authorization) throws BaseException;

    /**
     * 牵引车多条取消认证
     *
     * @param carrierIds
     */
    void batchUpdateCancelAuthStatusByIds(Long[] carrierIds) throws BaseException;

    /**
     * 根据车牌号获取牵引车信息
     *
     * @param plate
     * @return
     */
    CarrierInfoLineVO getCarrierInfoByPlate(String plate);

    /**
     * 获取所有已经认证的牵引车车牌
     *
     * @return
     */
    List<String> authedCarrierPlate();

    List<String> authedTenantPlate(Long tenantId);

    /**
     * 根据承运商id数组获取底下的所有牵引车id
     *
     * @param lspIdList
     * @return
     */
    List<Long> selectIdByLspIds(List<Long> lspIdList);

    /**
     * 根据ID批量更新状态
     *
     * @param authStatus
     * @param status
     * @param idList
     */
    void batchUpdateAuthStatusByIds(Integer authStatus, Integer status, List<Long> idList);


    /**
     * 获取牵引车与挂车列表
     *
     * @param page
     * @return
     */
    Page<CarrierTrailerBO> queryPageCarrierTrailer(Page<CarrierTrailerBO> page, String authorization);


    /**
     * 更换车辆所属承运商并解除相关绑定
     * 此时需解除牵引车与挂车、司机的绑定关系
     *
     * @param carrierIds    车辆ID集合
     * @param lspId         目标承运商
     * @param isAllTransfer 是否转移司机和挂车
     * @return
     */
    boolean changeLspAndRemoveRelation(Long[] carrierIds, Long lspId, Integer isAllTransfer, String authorization);

    /**
     * 更换车辆以及所关联信息的所属承运商
     * 此时需同步调整关联的牵引车、司机的所属承运商
     *
     * @param carrierIds 车辆ID集合
     * @param lspId      目标承运商
     * @return
     */
    boolean changeLspAndRelation(Long[] carrierIds, Long lspId);

    /**
     * 查询可用挂车
     *
     * @param carrierId    牵引车ID
     * @param trailerPlate 挂车车牌
     * @return
     */
    List<TrailerCarrierBO> queryUsableTrailer(Long carrierId, String trailerPlate, String authorization);

    /**
     * 绑定挂车
     *
     * @param carrierId 牵引车ID
     * @param trailerId 挂车ID
     * @return
     */
    boolean bingTrailer(Long carrierId, Long trailerId, Long tenantId, String authorization);

    /**
     * 解绑挂车
     *
     * @param carrierId 牵引车ID
     * @param trailerId 挂车ID
     * @return
     */
    boolean unbingTrailer(Long carrierId, Long trailerId, String authorization);

    void carrierAndTrailerToOtm(Long carrierId, String isAtcive);

    /**
     * 得到可用牵引车
     *
     * @param ew
     * @return
     */
    List<CarrierDriverBO> listUsableCarrier(Wrapper<CarrierDriverBO> ew);

    /**
     * 批量删除牵引车
     *
     * @param carrierIds
     * @return
     */
    List<String> deleteByIds(Long[] carrierIds);

    /**
     * 提交车辆信息
     *
     * @param vehicleVO
     */
    void submitVehicle(VehicleVO vehicleVO, String authorization);

    void submitVehicleAttach(AttachVO attachVO);

    /**
     * 根据司机id获取车辆信息
     *
     * @param driverId
     * @return
     */
    VehicleBO getVehicleByDriverId(Long driverId);

    /**
     * 解绑牵引车
     *
     * @param driverId 司机ID
     * @param plate    牵引车车牌
     * @return
     */
    VehicleBO unbindVehicle(Long driverId, String plate);

    /**
     * 验证司机和牵引车的绑定关系
     *
     * @param driverId
     * @param plate
     * @return
     */
    Boolean verifyCarrier(Long driverId, String plate);


    /**
     * 根据司机id获取
     *
     * @return
     */
    CarrierInfoBO selectByDriverId(Long driverId);

    /**
     * 牵引车完善信息状态
     *
     * @param carrierId
     * @param typeCode
     * @param subjectCode
     * @return
     */
    Boolean getCarrierStatus(Long carrierId, String typeCode, String subjectCode);

    /**
     * 分页查询车辆信息
     *
     * @param page
     * @return
     */
    Page<WeChatVehicle> queryPageVehicle(Page<WeChatVehicle> page, String authorization);

    /**
     * 获取库内所有牵引车基础信息列表
     *
     * @param ew
     * @return
     */
    List<CarrierInfo> selectCarrierListNoTenant(Wrapper<CarrierInfo> ew);

    /**
     * 分页查询车辆信息
     *
     * @param id
     * @return
     */
    WeChatVehicle getWeChatVehicleById(Long id);


    /**
     * 更新牵引车信息不存在创建
     *
     * @param carrierInfo
     * @return
     */
    CarrierInfo updateCarrier(CarrierInfo carrierInfo);

    /**
     * 获取承运商单条信息
     *
     * @param carrierId
     * @return
     */
    CarrierBasicVO getCarrierInfoLine(Long carrierId);

    /**
     * 更新车辆所属承运商
     *
     * @param carrierInfo
     * @return
     */
    Integer updateLsp(CarrierInfo carrierInfo);

    /**
     * 根据id号，恢复指定牵引车的删除状态
     *
     * @param ids
     * @return
     */
    List<String> updateDeleteStatus(List<Long> ids);


    WeChatVehicle selectVehicleByCarrierIdOrTrailerId(Long id, Long trailerId);

    /**
     * 获取承运商下  认证且绑定挂车/司机的牵引车信息
     */
    Page<CarrierDetailVO> queryCarrierByLsp(Page<CarrierDetailVO> page, String authorization);

    /**
     * 车俩推otm
     */
    void vehicleToOtm(Long id, String authorization);

    WeChatVehicle selectVehicleByCTNoTenant(Long id, Long tid);

    /**
     * 设置推OTM车队类型
     * @param carrierId 牵引车ID
     * @param trailerId 挂车ID
     * @param weChatVehicle 接收数据对象
     */
    void toOtmSetFleetType(Long carrierId,Long trailerId,WeChatVehicle weChatVehicle);

    List<WeChatVehicle> selectVehicleByCarrierIdOrTrailerIdNoTenant(Long carrierId, Long trailerId);

    CarrierInfoBO selectByDriverIdNoTenant(Long driverId);
}
